package com.fowo.api.sys.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fowo.api.sys.entity.SysMessage;
import com.fowo.api.sys.model.CreateSysMessage;
import com.fowo.api.sys.model.SysMessageItemVo;
import com.fowo.api.sys.model.SysMessageSearch;
import com.fowo.api.sys.model.SysMessageText;

import java.util.Collections;
import java.util.List;

/**
 * 系统消息服务
 */
public interface SysMessageService {

    /**
     * 获取指定消息
     * @param id 消息编号
     */
    SysMessage getById(Long id);

    /**
     * 消息搜索
     * @param search 消息搜索条件
     */
    Page<SysMessageItemVo> searchPage(SysMessageSearch search);

    /**
     * 创建消息
     */
    boolean create(CreateSysMessage createSysMessage);

    /**
     * 创建平台消息
     * @param toUserIds 目标用户编号列表
     * @param title 标题
     * @param context 文本内容
     * @param link 链接，可空
     */
    default boolean createSysMessage(List<Long> toUserIds, String status, String title, String context, String link) {
        ObjectMapper objectMapper = new ObjectMapper();
        CreateSysMessage createSysMessage = new CreateSysMessage();
        createSysMessage.setCreateUserId(0L);
        createSysMessage.setStatus(status);
        createSysMessage.setTitle(title);
        createSysMessage.setType(SysMessage.TYPE_NOTIFICATION);
        createSysMessage.setLink(link);
        SysMessageText sysMessageText = new SysMessageText(context);
        try {
            createSysMessage.setContent(objectMapper.writeValueAsString(sysMessageText));
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        createSysMessage.setToUserIds(toUserIds);
        return create(createSysMessage);
    }

    /**
     * 创建平台消息
     * @param toUserId 目标用户
     * @param status 状态
     * @param title 标题
     * @param context 文本内容
     * @param link 链接，可空
     */
    default boolean createSysMessage(Long toUserId, String status, String title, String context, String link) {
        return createSysMessage(Collections.singletonList(toUserId), status, title, context, link);
    }

    /**
     * 获取用户的未读消息数
     * @param userId 消息接收者编号
     * @return 未读消息数量
     */
    Long getUnreadCount(Long userId);

    /**
     * 更新消息已读
     * @param userId 消息接收者编号
     * @param messageIds 消息编号列表
     */
    void updateRead(Long userId, List<Long> messageIds);

    /**
     * 消息创建者删除消息
     * @param messageIds 消息编号
     */
    void delete(List<Long> messageIds);

    /**
     * 消息接收者删除消息
     * @param userId 消息接收者编号
     * @param messageIds 消息编号
     */
    void deleteByReceiver(Long userId, List<Long> messageIds);

    /**
     * 消息接收者删除所有已读消息
     * @param userId 消息接收者编号
     */
    boolean deleteRead(Long userId);
}
